home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / bind_version.nasl < prev    next >
Text File  |  2005-03-31  |  4KB  |  149 lines

  1. #
  2. # This script was written by Noam Rathaus <noamr@securiteam.com>
  3. #
  4. # See the Nessus Scripts License for details
  5. #
  6.  
  7. if(description)
  8. {
  9.  script_id(10028);
  10.  script_version ("$Revision: 1.22 $");
  11.  name["english"] = "Determine which version of BIND name daemon is running";
  12.  script_name(english:name["english"]);
  13.  
  14.  desc["english"] = "
  15. BIND 'NAMED' is an open-source DNS server from ISC.org.  Many proprietary
  16. DNS servers are based on BIND source code.   
  17.  
  18. The BIND based NAMED servers (or DNS servers) allow  remote users
  19. to query for version and type information.  The query of the CHAOS
  20. TXT record 'version.bind', will typically prompt the server to send
  21. the information back to the querying source.  
  22.  
  23.  
  24. Solution :
  25. Using the 'version' directive in the 'options' section will block
  26. the 'version.bind' query, but it will not log such attempts.
  27.  
  28. Risk factor : Medium";
  29.  
  30.  script_description(english:desc["english"]);
  31.  
  32.  summary["english"] = "Determine which version of BIND name daemon is running";
  33.  script_summary(english:summary["english"]);
  34.  
  35.  script_category(ACT_GATHER_INFO);
  36.  
  37.  script_copyright(english:"This script is Copyright (C) 1999 SecuriTeam");
  38.  family["english"] = "General";
  39.  script_family(english:family["english"]);
  40.  
  41.  exit(0);
  42. }
  43.  
  44. #
  45. # The script code starts here
  46. #
  47. #
  48. # We try to gather the version number via TCP first, and if this
  49. # fails (or if the port is closed), we'll try via UDP
  50. #
  51. #
  52.  
  53. include("misc_func.inc");
  54.  
  55.  
  56. # start report off with generic description ... lots of proprietary DNS servers (Cisco, QIP, a bunch more
  57. # are all BIND-based...
  58.  
  59. data = string("BIND 'NAMED' is an open-source DNS server from ISC.org.\n");
  60. data += string("Many proprietary DNS servers are based on BIND source code.\n\n");
  61.  
  62. data += string("The BIND based NAMED servers (or DNS servers) allow remote users\n");
  63. data += string("to query for version and type information.  The query of the CHAOS\n");
  64. data += string("TXT record 'version.bind', will typically prompt the server to send\n");
  65. data += string("the information back to the querying source.\n");
  66.  
  67.  
  68.  soctcp53 = 0;
  69.  
  70.  if(get_port_state(53))
  71.   {
  72.   soctcp53 = open_sock_tcp(53);
  73.  }
  74.  if(!soctcp53){
  75.   if(!(get_udp_port_state(53)))exit(0);
  76.   socudp53 = open_sock_udp(53);
  77.   soc = socudp53;
  78.   offset = 0;
  79.   }
  80.   else {
  81.       soc = soctcp53;
  82.     offset = 2;
  83.       }
  84.   
  85.  if (soc)
  86.  {
  87.   
  88.   raw_data = raw_string(
  89.             0x00, 0x0A, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
  90.             0x00, 0x00, 0x07);
  91.   
  92.   if(offset)raw_data = raw_string(0x00, 0x1E) + raw_data;
  93.   
  94.   raw_data = raw_data + "VERSION";
  95.   raw_data = raw_data + raw_string( 0x04 );
  96.   raw_data = raw_data + "BIND";
  97.   raw_data = raw_data + raw_string(
  98.                    0x00, 0x00, 0x10, 0x00, 0x03);
  99.  
  100.   send(socket:soc, data:raw_data);
  101.   result = recv(socket:soc, length:1000);
  102.   if (result)
  103.   {
  104.     if ((result[0+offset] == raw_string(0x00)) && (result[1+offset] == raw_string(0x0A)))
  105.     {
  106. # ignore recursion request and recursion available bits in answer
  107. # (usually the request bit is set if it was set in the query but
  108. # this is not necessary, the recursion available bit is clear if
  109. # the server doesn't allow recursion which should be the case
  110. # for a properly setup external primary nameserver
  111.      if (((result[2+offset] == raw_string(0x85))||(result[2+offset] == raw_string(0x84))) && ((result[3+offset] == raw_string(0x80))||(result[3+offset] == raw_string(0x00))))
  112.      {
  113.       if ((result[4+offset] == raw_string(0x00)) && (result[5+offset] == raw_string(0x01)))
  114.       {
  115.        if ((result[6+offset] == raw_string(0x00)) && (result[7+offset] == raw_string(0x01)))
  116.        {
  117. # take care of result compression (we know that a pointer starts with c0
  118. # or higher)
  119.         if(result[30+offset]>=0xc0)base=40;
  120.         else base=52;
  121.         size = ord(result[base+1+offset]);
  122.         slen = base + 3 + offset - 1;
  123.         if(slen > strlen(result))exit(0);
  124.         if (size > 0)
  125.         {
  126.          hole_data = "";
  127.          for (i = 0; i < size - 1; i = i + 1)
  128.          {
  129.           hole_data = hole_data + result[base+3+i+offset];
  130.          }
  131.          data += string("\nThe remote bind version is : ", hole_data,"\n\n");
  132.                  data += string("Solution :\n");
  133.                  data += string("Using the 'version' directive in the 'options' section will block\n");
  134.                  data += string("the 'version.bind' query, but it will not log such attempts.\n");
  135.  
  136.          if(offset)proto = "tcp";
  137.          else proto = "udp";
  138.          security_note(port:53, data:data, protocol:proto);
  139.          set_kb_item(name:"bind/version",value:hole_data);
  140.         }
  141.        }
  142.       }
  143.      }
  144.     }
  145.  close(soc);
  146.   }
  147.  }
  148.  
  149.